Estoy tratando de usar funciones del ejemplo Observable Plot con el gráfico marimekko en mi proyecto con mecanografiado y obtuve este error en esta cadena:
setXz(I.map((i) => sum.get(X[i])))El código es:
function marimekko({ x, y, z, inset = 0.5, ...options }) { const [Xz, setXz] = lazyChannel(z) const { y1, y2, transform: stackY, } = Plot.stackY({ offset: "expand", x, y: z }) const { x1, x2, transform: stackX, } = Plot.stackX({ offset: "expand", y, x: Xz }) return { x1, x2, y1, y2, transform: (data, facets) => { const I = d3.range(data.length) const X = Plot.valueof(data, x) const Z = Plot.valueof(data, z) const sum = d3.rollup( I, (I) => d3.sum(I, (i) => Z[i]), (i) => X[i] ) setXz(I.map((i) => sum.get(X[i]))) stackX(data, facets) stackY(data, facets) return { data, facets } }, inset, ...options, } } function lazyChannel(source) { let value return [ { transform: () => value, label: typeof source === "string" ? source : source ? source.label : undefined, }, (v) => (value = v), ] }¿Alguna idea para solucionarlo?
Su función devuelve setXz del siguiente tipo:
((v: any) => any) | { transform: () => any; label: any; }Tenga en cuenta la unión, contiene un objeto que no se puede llamar.
Eso sucede porque TS no infiere la tupla sino que devuelve una matriz de las uniones de los tipos posibles.
Al menos debe escribir el retorno de su función.
function lazyChannel(source): [{ transform: () => any, label: any}, ((v: any) => any)] { let value return [ { transform: () => value, label: typeof source === "string" ? source : source ? source.label : undefined, }, (v) => (value = v), ] } Tenga en cuenta que aconsejaría no usar any , pero especificar los tipos de parámetros y devolver.